DBMail permet de stocker les courriels dans une base de données au lieu du disque, et d'y accéder en IMAP ou POP.
Il travaille en conjonction avec Postfix, l'agent de transfert de courriel (MTA) par défaut d'Ubuntu.
sudo dig domain.tld && sudo dig mx domain.tld #doit exister
ssh toto@www.domain.tld #exemple1 ; lynx http://www.domain.tld #exemple2
| Auto-hébergé | Registrar type | GANDI | Paliatif | Smtp | Imap Pop | ||
|---|---|---|---|---|---|---|---|
| Cas | IP fixe | dynamique | DNS zone | MX | dyndns no-ip | POSTFIX DBMAIL | |
| 1 | oui | x | GANDI | oui | x | Envoyer ET Recevoir | oui |
| 2 | OVH | ||||||
| 3 | x | oui | test.domain.tld | ok.dyndns.org | ok.dyndns.org | Envoyer ET Recevoir | test.domain.tld mail is handled by ok.dyndns.org. |
| 4 | x | oui | x | x | ok.dyndns.org | Envoyer Uniquement | ok.dyndns.org has no MX record. voir smtp_generic_maps |
| 4 | ——————–> dbmail est inutile : Recevoir sur imap.fai.fr imap.gmail.com | canonical_maps relayhost /etc/aliases | |||||
| 5 | x | oui | x | x | ok.dyndns.org mxok.dyndns.org | Envoyer ET Recevoir | ok.dyndns.org mail is handled by mxok.dyndns.org. |
| 6 | |||||||
légende; x=non, host -t mx domain.tld
Cas 1,2,3 recommandés
Ajout à la fin de /etc/postfix/master.cf
sudo vim /etc/postfix/master.cf dbmail-lmtp unix - - n - - lmtp
sudo dpkg-reconfigure postfix
sudo nano /etc/mailname
domain.com
NB: valable également pour un sous.domain.com en tant que domaine de messagerie
sudo nano /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
append_dot_mydomain = no
readme_directory = no
myhostname = smtp.domain.com
mydomain = domain.com
mydestination = smtp.domain.com, localhost.domain.com, localhost
# méthode virtual
# supprimer mydestination
# relay_domains = $mynetworks
# relay_recipient_maps = mysql:/etc/postfix/sql-virtual_mailbox_maps.cf
myorigin = $mydomain
relayhost =
mynetworks = 127.0.0.0/8, 192.168.1.0/24
relay_domains = $mydestination
mailbox_size_limit = 51200000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
smtpd_recipient_restrictions =
permit_auth_destination,
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_hostname,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_destination,
reject_unauth_pipelining,
reject_invalid_hostname,
reject_rbl_client opm.blitzed.org,
reject_rbl_client list.dsbl.org,
reject_rbl_client bl.spamcop.net,
reject_rbl_client sbl-xbl.spamhaus.org
reject
virtual_transport = dbmail-lmtp:localhost:24
virtual_mailbox_domains = mysql:/etc/postfix/sql-virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql-virtual_mailbox_maps.cf
Création de /etc/postfix/sql-virtual_mailbox_domains.cf
sudo vim /etc/postfix/sql-virtual_mailbox_domains.cf user = dbmail password = password hosts = 127.0.0.1 dbname = dbmail query = SELECT DISTINCT 1 FROM dbmail_aliases WHERE SUBSTRING_INDEX(alias, '@', -1) = '%s';
Création de /etc/postfix/sql-virtual_mailbox_maps.cf
sudo vim /etc/postfix/sql-virtual_mailbox_maps.cf user = dbmail password = password hosts = 127.0.0.1 dbname = dbmail query = SELECT 1 FROM dbmail_aliases WHERE alias='%s';
Redémarrage postfix
sudo /etc/init.d/postfix restart sudo postfix reload
sudo nano /etc/apt/sources.list
# squeeze deb http://debian.nfgd.net/debian/ squeeze main # sid deb http://debian.nfgd.net/debian/ sid main # lucid deb http://debian.nfgd.net/debian/ lucid main
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install dbmail
apt://dbmail (mysql est déjà inclus dans ce paquet) Téléchargement
Présent normalement dans les dépôts. apt://dbmail,dbmail-mysql.
Création du schema dbmail
mysql -uroot -p mysql> CREATE schema dbmail; mysql>ALTER DATABASE `dbmail` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Récupération et décompression du modèle de table :
cp /usr/share/doc/dbmail-mysql/examples/create_tables.mysql.gz ~/ gzip --decompress ~/create_tables.mysql.gz
Création des tables
mysql -uroot -p dbmail < ~/create_tables.mysql
Création d'un utilisateur dbmail
mysql -uroot -p GRANT ALL ON dbmail.* to dbmail@localhost identified by 'password';
Modification des lignes suivantes dans /etc/dbmail/dbmail.conf
sudo vim /etc/dbmail/dbmail.conf driver = mysql authdriver = sql host = localhost sqlsocket = /var/run/mysqld/mysqld.sock user = dbmail pass = password db = dbmail SIEVE_NOTIFY = no
Modification de /etc/default/dbmail pour le démarrage de l'imap et lmtp
sudo vim /etc/default/dbmail START_IMAPD=1 START_LMTPD=1 START_SIEVE=1
Redémarrage de dbmail
sudo service dbmail restart
sudo dbmail-users
Ajouter & Créer un nouveau compte toto@domain.tld avec son adresse mail toto@domain.tld
sudo dbmail-users -a toto@domain.ltd -w mypass -p md5 -s toto@domain.ltd Adding INBOX for new user... ok. [toto@domain.tld] Done
Supprimer un compte
sudo dbmail-users -d toto@domain.tld
Dbmail utilise saslauthd comme démon d'authentification (sasl authentication server). Rimap (Requête d'authentification au près du serveur IMAP) et LDAP sont les plus intéressants pour les méthodes virtual. Pam n'est pas vraiment adapté pour la messagerie de masse et il y a toujours moyen de convertir un user unix/pam en virtual/rimap par exemple. Avec les solutions Webmail, ce sentiment est renforcé.
sudo nano /etc/postfix/sender_canonical
user_unix user_virtual@domain.tld user_unix@domain.tld user_virtual@domain.tld
sudo postmap hash:/etc/postfix/sender_canonical sudo postconf -e 'sender_canonical_maps = hash:/etc/postfix/sender_canonical' sudo dbmail-users -a user_virtual@domain.tld -s user_virtual@domain.tld -w mot_de_passe
user_virtual@domain.tld sert de récipient.
START=yes NAME="saslauthd" MECHANISMS="rimap" MECH_OPTIONS="localhost" THREADS=5 OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"
sudo service saslauthd restart|reload
à titre d'information
broken_sasl_auth_clients = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtpd_recipient_restrictions = permit_auth_destination, permit_mynetworks, permit_sasl_authenticated, ...., reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject smtpd_sasl_auth_enable = yes smtpd_sasl_authenticated_header = no smtpd_sasl_local_domain = domain.tld smtpd_sasl_path = smtpd smtpd_sasl_security_options = noanonymous smtpd_sasl_type = cyrus
Sert principalement à s'authentifier auprès d'un relais serveur smtp dans le but de s'en servir comme transporteur. ( voir relayhost, transport_maps )
sudo nano /etc/postfix/sasl_passwd
[11.22.22.44]:587 compte@fai.fr:mot_de_passe smtp.gmail.com:587 compte@gmail.com:mot_de-passe
sudo postmap hash:/etc/postfix/sasl_passwd sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
la même chose pour smtp,submisson,smtps
submission inet n - n - - smtpd
....
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
P'tit rappel;
sudo dbmail-users -c toto@domain.tld -p plaintext -w password
sudo ln -s /usr/lib/sasl2/smtpd.conf /etc/postfix/smtpd.conf sudo ln -s /usr/lib64/sasl2/smtpd.conf /etc/postfix/smtpd.conf
pwcheck_method: saslauthd mech_list: cram-md5 login auxprop_plugin: sql sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: dbmail sql_passwd: pass sql_database: dbmail sql_verbose: yes sql_select: SELECT passwd FROM dbmail_users WHERE userid = '%u'
AUTH=LOGIN AUTH=CRAM-MD5
... # Provide a CAPABILITY to override the default # # capability = IMAP4 IMAP4rev1 AUTH=LOGIN ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE ...
smtp_sasl_mechanism_filter = cram-md5 login
18:49:46 www roundcube: [77EB] C: A0001 ID ("name" "Roundcube Webmail" "version" "0.7.1" "php" "5.3.2-1ubuntu4.14" "os" "Linux" "command" "/roundube/?_task=mail&_action=moveto")
18:49:46 www roundcube: [77EB] S: * ID ("name" "dbmail" "version" "3.0.1" "os" "Linux" "os-version" "2.6.32-41-generic")
18:49:46 www roundcube: [77EB] S: A0001 OK ID completed
18:49:46 www roundcube: [77EB] C: A0002 AUTHENTICATE CRAM-MD5
18:49:46 www roundcube: [77EB] S: + MTM0MzA2MjE4Ni4xOTIzMy4yNkAobm9uZSk=
18:49:46 www roundcube: [77EB] C: ZXJyb3JAbS50aXRvdS5pbmZvIDczZmQwYmY4NWNiZjQ3YTM3YjliYzNhMWYwOTA5Nzcy
18:49:46 www roundcube: [77EB] S: A0002 OK [CAPABILITY IMAP4rev1 ACL RIGHTS=texk NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT IDLE
STARTTLS ID] User toto@domain.tld authenticated
Losque les domaines appartiennent au même mx, il s'agit plutôt d'alias et dérivés. Les domaines partagent également le même démon d'authentification (saslauthd)
sudo dbmail-users -c toto@domain.tld -s toto@domain.tld,tata@domain.tld,oto@domain2.tld2,tata@domain3.tld3
smtpd_sasl_local_domain = domain.tld domain2.tld2 domain3.tld3
Lorsque les mx sont différents, cela ressemble plutôt à des méthodes de type forward
pour envoyer des mails, sender_canonical_maps est suffisant
sudo nano /etc/postfix/sender_canonical
yoko pierre.durand@gmail.com yoko@domain.tld pierre.durand@gmail.com
sudo postmap hash:/etc/postfix/sender_canonical sudo postconf -e 'sender_canonical_maps = hash:/etc/postfix/sender_canonical'
test
yoko@pc:~$ echo 'bonjour' | mail -s 'test' toto@sfr.fr
yoko devient pierre.durand@gmail.com, qui envoit au destinataire final toto@sfr.fr
le courrier à destination de toto@domain.tld est renvoyé chez durand.pierre@free.fr
sudo dbmail-users -x toto@domain.tld -t durand.pierre@free.fr
sudo apt-get install imapsync
Dans l'exemple qui suit, la boîte aux lettres de gmail est copié sur une boîte aux lettres récemment crée de votre domaine.
imapsync --host1 imap.gmail.com --user1 compte@gmail.com --password1 motdepasse_gmail --port1 993 --ssl1 --authmech1 LOGIN --host2 mail.domain.tld --user2 yoko@domain.tld --password2 motdepasse_yoko --dry
imapsync --host1 imap.gmail.com --user1 compte@gmail.com --password1 motdepasse_gmail --port1 993 --ssl1 --authmech1 LOGIN --host2 mail.domain.tld --user2 yoko@domain.tld --password2 motdepasse_yoko
sudo apt-get install fetchmail
fetchmailconf sert à rien et risque de vous induire en erreurs.
Dans l'exemple ci-dessous, le courrier est rapatrié d'un compte gmail
sudo nano /etc/fetchmailrc
# Read the ISP accounts every 3600 seconds set syslog set daemon 3600 # Configure the ISP accounts (POP server, users and respective passwords) poll imap.gmail.com with protocol IMAP: user "pierre.durand@gmail.com" with pass "motdepasse-de-pierre" with ssl with sslcertck is "yoko@domain.tld" here keep smtphost smtp.domain.tld
Fetchmail relève toutes les heures les mails de pierre.durand@gmail.com et les rapatrie directement sur yoko@domain.tld.
Fetchmail fait un doublon, voir inutile, si vous avez délà roundcube, horde, qui font déjà du fetch.
$rcmail_config['default_host'] = array(
....
'imap.free.fr:143' => 'FREE',
'ssl://imap.gmail.com:993' => 'GMAIL',
'imap.gmx.com:143' => 'GMX',
'ssl://imap.orange.fr:993' => 'ORANGE',
'imap.sfr.fr:143' => 'SFR',
'ssl://imap.domain.tld:993' => 'mondomaine',
'ssl://imap.mail.yahoo.com:993' => 'YAHOO');
Fetchmail peut servir à créer des Shared Mailbox dbmail, encore plus complexes, en intégrant des domaines de mx différents.
Ces boîtes sont appelées boîtes aux lettres partagées - Elles sont décrites dans la table dbmail_subscription. Les droits d'accès appropriés sont décrits dans la table dbmail_acl.
vérification et récupérer le user_idnr
select user_idnr as reference, userid as login, passwd as password from dbmail_users;
+-----------+--------------------------------+------------------------------------+
| reference | login | password |
+-----------+--------------------------------+------------------------------------+
| 1 | __@!internal_delivery_user!@__ | |
| 2 | anyone | |
| 3 | __public__ | |
....
sudo dbmail-users -l __public__ | awk -F: '{print$3}' # renvoit 3
Téléchargement Ce script permet de créer plus facilement les boîtes aux lettres partagées.
mkdir ~/dbmail ; cd ~/dbmail wget http://linux.bononline.nl/linux/dbmail/src/dbmail-acl.sh sudo cp /etc/dbmail/dbmail.conf . sudo chown votre_user:votre_user ./dbmail.conf sudo chmod +x dbmail-acl.sh
Renseigner la partie
DBMAIL[_dbmail_mysqldatabase]="dbmail" DBMAIL[_dbmail_mysqluser]="dbmail" DBMAIL[_dbmail_mysqlpassword]="gdhgybvudo" DBMAIL[_dbmail_mysqlhost]="localhost" DBMAIL[_dbmail_conffile]="/home/votre_user/dbmail/dbmail.conf" DBMAIL[_dbmail_driver]="mysql"
modifier pour dbmail 3.x à proximité de function get_all_acls()
$MYSQL_CLIENT -N -e "SELECT lookup_flag, read_flag, seen_flag, write_flag, insert_flag, post_flag, create_flag, delete_flag, deleted_flag, expunge_flag, administer_flag FROM dbmail_acl WHERE mailbox_id = $mailbox_idnr and user_id = $user_idnr;"
et acl_add()
$MYSQL_CLIENT -e "INSERT INTO dbmail_acl values ($user_idnr, $mailbox_idnr, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);"
Au besoin, si dbmail-acl.sh ne crée pas les mailboxes.
insert INTO dbmail_mailboxes (owner_idnr, name, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, no_inferiors, no_select, permission, seq ) VALUES ( '2', 'INBOX', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0' );
insert INTO dbmail_mailboxes (owner_idnr, name, seen_flag, answered_flag, deleted_flag, flagged_flag, recent_flag, draft_flag, no_inferiors, no_select, permission, seq ) VALUES ( '3', 'INBOX', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0' );
en supposant que vous ayez 3 comptes distincts;
sudo dbmail-users -a t1@domain.tld -s t1@domain.tld -w t1 sudo dbmail-users -a t2@domain.tld -s t2@domain.tld -w t2 sudo dbmail-users -a t3@domain.tld -s t3@domain.tld -w t3
t1@mdomain.tld partage sa mailbox avec t2@domain.tld et t3@domain.tld
sudo bash ~/dbmail/dbmail-acl.sh add t2@domain.tld t1@mdomain.tld Taking default mailbox INBOX Adding (full) acl rights for 26 to 60. Adding subscription of 26 to 60. sudo bash ~/dbmail/dbmail-acl.sh add t3@domain.tld t1@domain.tld Taking default mailbox INBOX Adding (full) acl rights for 27 to 60. Adding subscription of 27 to 60.
en supposant que vous ayez 1 compte distinct;
sudo dbmail-users -a entreprise@domain.tld -s entreprise@domain.tld -w entreprise
sudo bash ~/dbmail/dbmail-acl.sh add entreprise@domain.tld __public__ Taking default mailbox INBOX Adding (full) acl rights for 28 to 51. Adding subscription of 28 to 51.
ajouter une adresse mail 'project@domain.tld' pour #Public
insert into dbmail_aliases ( alias, deliver_to, client_idnr ) value ( 'project@domain.tld', '3', '0' )
sudo dbmail-users -a open@domain.tld -s open@domain.tld -w open sudo bash ~/dbmail/dbmail-acl.sh add open@domain.tld anyone
ajouter une adresse mail 'anyone@domain.tld'
insert into dbmail_aliases ( alias, deliver_to, client_idnr ) value ( 'anyone@domain.tld', '2', '0' )
C'est l'équivalence de virtual-aliases pour d'autres serveurs imap. Il n'y a pas besoin également de rajouter des aliases dans /etc/aliases. Les récipients des listes se trouvent dans la table dbmail_aliases
sudo nano dbmail-add-list
#!/bin/bash #14/07/2012 # sudo bash dbmail-addl-list <list_name> #DOMAINNAME est le domaine de messagerie if [ "x$1" == "x" ]; then echo "No maillist specified" echo "Usage: dbmail-add-list <list_name>" exit 1 fi DOMAINNAME="@list.domain.tld" #DOMAINNAME="@domain.tld" si vous n'avez pas beaucoup de listes. MAILLIST=$1 echo "dbmail-users -x $MAILLIST$DOMAINNAME -t \"|/usr/lib/mailman/mail/mailman post $MAILLIST\"" dbmail-users -x $MAILLIST$DOMAINNAME -t "|/usr/lib/mailman/mail/mailman post $MAILLIST" for i in admin bounces confirm join leave owner request subscribe unsubscribe; do echo "dbmail-users -x $MAILLIST-$i$DOMAINNAME -t \"|/usr/lib/mailman/mail/mailman $i $MAILLIST\"" dbmail-users -x $MAILLIST-$i$DOMAINNAME -t "|/usr/lib/mailman/mail/mailman $i $MAILLIST" done
sudo newlist pub
sudo bash /home/…/dbmail-add-list pub
dbmail-users -x pub@list.domain.tld -t "|/usr/lib/mailman/mail/mailman post pub" [|/usr/lib/mailman/mail/mailman post pub] Done dbmail-users -x pub-admin@list.domain.tld -t "|/usr/lib/mailman/mail/mailman admin pub" [|/usr/lib/mailman/mail/mailman admin pub] Done ... ....... dbmail-users -x pub-subscribe@list.domain.tld -t "|/usr/lib/mailman/mail/mailman subscribe pub" [|/usr/lib/mailman/mail/mailman subscribe pub] Done dbmail-users -x pub-unsubscribe@list.domain.tld -t "|/usr/lib/mailman/mail/mailman unsubscribe pub" [|/usr/lib/mailman/mail/mailman unsubscribe pub] Done
sudo list_lists
2 listes correspondantes trouvées
Mailman
Pub
sudo rmlist pub
mailman unix - n n - - pipe
flags=FR user=list:list
argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
list.domain.tld mailman:
sudo check_perms; sudo check_perms -f # pour fixer les problèmes
sudo withlist -l -a -r fix_url
Les interfaces graphiques à base de LAMP ou équivalent, pas obligatoires pour manager son dbmail.
Ne pas oublier d'ouvrir les ports du pare-feu
Exemple avec shorewall :
sudo vim /etc/shorewall/rules IMAP/ACCEPT net $FW SMTP/ACCEPT net $FW
redémarrage du pare-feu
sudo /etc/init.d/shorewall restart